package com.wx.gof.principle.dependencyinversion;

/**
 * @ClassName Application
 * @Author wx
 * @Description 应用程序-依赖倒置原则(高层不依赖底层，二者都应该依赖抽象-高层不依赖具体细节实现，依赖抽象)
 * @Date 2018-12-02-16:49
 */
public class Application {
    public static void main(String[] agrs) {
        /**
         * 下面代码是程序员需要要学习的课程,这里打破了依赖倒置原则，高层是不能直接依赖底层的具体细节实现
         * 高层是只当前这个应用程序，底层是指Programmer具体的实现，如果我门需要这个程序员去学习更多的课程，
         * 要去Programmer内部修新增改代码
         */
        Programmer programmer = new Programmer();
        programmer.studyJavaCourse();
        programmer.studyPythonCourse();
        
        /**
         * 假设现在需要给程序员新增一个css课程，我们只需要添加一个实现类即可，ProgrammerV2内部代码不会有任何变动，
         * 应用程序只需要设置不同的课程即可
         */
        ProgrammerV2 programmerV2 = new ProgrammerV2();
        programmerV2.setiCourse(new JavaCourse());
        programmerV2.studyImoocCourse();
        programmerV2.setiCourse(new PythonCourse());
        programmerV2.studyImoocCourse();
        programmerV2.setiCourse(new CssCourse());
        programmerV2.studyImoocCourse();

    }
}
